GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Staking — Devnet Live Demo

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

:root { --bg:#0b1220; --panel:#0f1830; --text:#e7eeff; --muted:#8aa1c7; --accent:#3b82f6; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

html,body{margin:0;background:var(--bg);color:var(--text);font:16px/1.5 system-ui,Segoe UI,Roboto,Helvetica,Arial;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.wrap{max-width:1000px;margin:42px auto;padding:0 20px;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

h1{font-weight:800;letter-spacing:.3px;margin:0 0 12px;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:14px 0 18px;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.card{background:var(--panel);border-radius:14px;padding:16px 18px;box-shadow:0 2px 18px rgba(0,0,0,.25)}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.k{font-size:13px;color:var(--muted);margin-bottom:6px}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.v{font-size:22px;font-weight:750}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.live{margin:8px 0 18px;font-size:13px;color:#86efac}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.legend{display:flex;gap:14px;font-size:13px;color:var(--muted);margin:10px 0 6px}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.dot{width:10px;height:10px;border-radius:50%}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.row{display:flex;align-items:center;gap:10px}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

canvas{background:#0a1327;border-radius:14px}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

a{color:#9cc2ff;text-decoration:none}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.muted{color:var(--muted)}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

🌊 GoodWave Staking — Devnet Live Demo

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

Total Staked
— GWAVE

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

Total Earned
— GWAVE

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

Total Fees Earned
— GWAVE

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

LIVE • waiting for data…

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

Staked

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

Earned

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

Fees (cumulative)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

Updates every ~60s from docs/data/index.json and docs/data/pool.json.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

Source: repo

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const fmt = n => Number(n ?? 0).toLocaleString(undefined,{minimumFractionDigits:2,maximumFractionDigits:6});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const $ = sel => document.querySelector(sel);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const cacheBust = () => `?ts=${Date.now()}`;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

async function jget(path){ const r = await fetch(`data/${path}${cacheBust()}`, {cache:'no-store'}); if(!r.ok) throw new Error(path+': '+r.status); return r.json(); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let chart;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

function ensureChart(labels, staked, earned, fees){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const ctx = document.getElementById('gw-chart').getContext('2d');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (chart) { chart.data.labels = labels; chart.data.datasets[0].data = staked; chart.data.datasets[1].data = earned; chart.data.datasets[2].data = fees; chart.update(); return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

chart = new Chart(ctx,{

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

type:'line',

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

data:{ labels, datasets:[

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

{ label:'Staked', data:staked, borderColor:'#60a5fa', backgroundColor:'rgba(96,165,250,.2)', tension:.25, fill:false },

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

{ label:'Earned', data:earned, borderColor:'#34d399', backgroundColor:'rgba(52,211,153,.2)', tension:.25, fill:false },

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

{ label:'Fees', data:fees, borderColor:'#f59e0b', backgroundColor:'rgba(245,158,11,.2)', tension:.25, fill:false },

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

]},

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

options:{

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

responsive:true,

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

animation:false,

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

plugins:{ legend:{display:false}},

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

scales:{

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

x:{ ticks:{ color:'#8aa1c7' }, grid:{ color:'rgba(255,255,255,.06)'} },

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

y:{ ticks:{ color:'#8aa1c7' }, grid:{ color:'rgba(255,255,255,.06)'} }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

function age(tsIso){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const now = Date.now(), then = Date.parse(tsIso||Date.now());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const s = Math.max(0,Math.round((now-then)/1000));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

return s + 's ago';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

async function refresh(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try{

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// pool.json has the freshest KPIs

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await jget('pool.json');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

$('#kpi-staked').textContent = `${fmt(pool.total_staked)} GWAVE`;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

$('#kpi-earned').textContent = `${fmt(pool.total_earned)} GWAVE`;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

$('#kpi-fees').textContent = `${fmt(pool.fees_total)} GWAVE`;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

$('#kpi-live').textContent = `LIVE • updated ${age(pool.ts)}`;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// index.json for historical lines

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await jget('index.json');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const points = Array.isArray(idx.points) ? idx.points : [];

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const labels = points.map((p,i)=> p.ts || i+1);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const staked = points.map(p => Number(p.total_staked||0));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const earned = points.map(p => Number(p.total_earned||0));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const fees = points.map((_,i)=> Number(idx.fees_total||0)); // draw as flat/cumulative

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

ensureChart(labels, staked, earned, fees);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}catch(e){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

$('#kpi-live').textContent = 'Waiting for data… (auto-retrying)';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

console.error(e);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

refresh();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setInterval(refresh, 60000);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-livebar {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

display:flex; align-items:center; gap:.75rem;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

padding:.5rem .75rem; margin:.75rem 0 1rem 0;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border-radius:12px; background:#0b1220; color:#d7e3ff;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

font: 500 14px/1.2 system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-livebar .dot {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

width:10px; height:10px; border-radius:50%;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#22c55e; /* default online */

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

box-shadow:0 0 0 0 rgba(34,197,94,.7);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

animation: pulse 1.6s infinite;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-livebar.offline .dot { background:#ef4444; box-shadow:0 0 0 0 rgba(239,68,68,.6); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-livebar.stale .dot { background:#f59e0b; box-shadow:0 0 0 0 rgba(245,158,11,.6); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

@keyframes pulse {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

0% { box-shadow:0 0 0 0 rgba(34,197,94,.7) }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

70% { box-shadow:0 0 0 10px rgba(34,197,94,0) }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

100% { box-shadow:0 0 0 0 rgba(34,197,94,0) }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-livebar.offline @keyframes pulse { /* same timing; color driven by class */ }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-livebar .label { letter-spacing:.02em; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-livebar .time { opacity:.85 }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

LIVE

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

— Updated: loading…

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

  • Supply split: Staking Rewards • Community • Treasury • Team (vesting)
  • Fees: Platform fee accrues transparently to on-chain fee wallet
  • Rewards: Distributed proportionally to stake weight and time-in-pool

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tz = 'Australia/Sydney';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const livebar = document.getElementById('gwave-livebar');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const upEl = document.getElementById('gwave-updated');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Insert right under the first H1 if possible (keeps the DOM tidy)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (h1 && livebar && livebar.parentElement !== h1.parentElement) {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

h1.insertAdjacentElement('afterend', livebar);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const formatAU = (ts) => {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const d = (typeof ts === 'number') ? new Date(ts*1000) : new Date(ts);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (isNaN(d.getTime())) return '—';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

return d.toLocaleString('en-AU', {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

timeZone: tz, hour12: false,

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

year:'numeric', month:'short', day:'2-digit',

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

hour:'2-digit', minute:'2-digit', second:'2-digit'

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const ageClass = (updatedMs) => {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!updatedMs) return 'offline';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const age = Date.now() - updatedMs;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (age > 5 * 60 * 1000) return 'offline'; // >5m = offline

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (age > 90 * 1000) return 'stale'; // >90s = stale

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

return 'online';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Prefer GH Pages mirror (relative), then fall back to local API

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = 'data/pool.json';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const LOCAL = 'http://127.0.0.1:5199/pool.json';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const fetchWithFallback = async () => {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (url) => fetch(url + (url.includes('?')?'&':'?') + '_cb=' + Date.now(), {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

cache: 'no-store'

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}).then(r => r.ok ? r.json() : Promise.reject(new Error(r.status)));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

return await tryOne(REL);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

return await tryOne(LOCAL);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch (e) {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

return null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const update = async () => {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const data = await fetchWithFallback();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!data) {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

livebar.classList.remove('online','stale'); livebar.classList.add('offline');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

upEl.textContent = 'connection error';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Common fields: prefer .updated, else .timestamp, else now

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const updated =

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(data.updated && (typeof data.updated === 'number' || typeof data.updated === 'string'))

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

? data.updated

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

: (data.timestamp || Date.now());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const updatedMs = (typeof updated === 'number' && updated < 2e12) ? updated*1000 : Number(updated);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Set label

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

upEl.textContent = formatAU(updatedMs);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Status classes

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

livebar.classList.remove('online','stale','offline');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

livebar.classList.add(ageClass(updatedMs));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

update();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setInterval(update, 30000); // 30s refresh

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tz = 'Australia/Sydney';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const formatAU = (ts) => {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const d = (typeof ts === 'number') ? new Date(ts*1000) : new Date(ts);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (isNaN(d.getTime())) return '—';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

return d.toLocaleString('en-AU',{

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

timeZone: tz, hour12: false, year:'numeric', month:'short', day:'2-digit',

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

hour:'2-digit', minute:'2-digit', second:'2-digit'

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const ageClass = (updatedMs) => {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!updatedMs) return 'offline';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const age = Date.now() - updatedMs;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (age > 5*60*1000) return 'offline';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (age > 90*1000) return 'stale';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

return 'online';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL='data/pool.json', LOCAL='http://127.0.0.1:5199/pool.json';

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const fetchWithFallback = async () => {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject(new Error(r.status)));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { try { return await tryOne(REL); } catch { return await tryOne(LOCAL); } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

catch { return null; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const paint = (cls, text) => {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.classList.remove('online','stale','offline');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.classList.add(cls);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = text;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tick = async () => {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const data = await fetchWithFallback();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!data) return paint('offline','LIVE • connection error');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const updated = (data.updated ?? data.timestamp ?? Date.now());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const ms = (typeof updated === 'number' && updated < 2e12) ? updated*1000 : Number(updated);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const cls = ageClass(ms);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

paint(cls, `LIVE • Updated: ${formatAU(ms)}`);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

tick();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setInterval(tick, 30000);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gwave-pills { display:flex; flex-wrap:wrap; gap:.5rem; margin:.5rem 0 1rem; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill { position:relative; padding:.4rem .6rem; border-radius:999px; font:600 12px/1 system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

background:#0f172a; color:#dbeafe; border:1px solid rgba(148,163,184,.25); }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="apy"]{ background:#052e16; color:#bbf7d0; border-color:rgba(74,222,128,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="lock"]{ background:#1e1b4b; color:#e9d5ff; border-color:rgba(196,181,253,.25);}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill[data-variant="points"]{ background:#0b1220; color:#c7d2fe;}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-tip { position:absolute; z-index:50; left:50%; transform:translateX(-50%); bottom:calc(100% + 8px);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

white-space:nowrap; padding:.45rem .6rem; border-radius:10px; font:500 12px/1.2 system-ui; background:#111827; color:#e5e7eb;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

border:1px solid rgba(255,255,255,.08); opacity:0; pointer-events:none; transition:opacity .15s ease; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.gw-pill:hover .gw-tip{opacity:1}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

(async function(){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pills = document.getElementById('gw-pills');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Anchor: place after #kpi-live if present; else after first h1

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const kpi = document.getElementById('kpi-live');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const h1 = document.querySelector('h1');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (kpi) kpi.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

else if (h1) h1.insertAdjacentElement('afterend', pills);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

} catch {}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const REL = (p)=>'data/'+p, LOCAL = (p)=>'http://127.0.0.1:5199/'+p;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const getJSON = async (p)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const tryOne = (u)=>fetch(u+(u.includes('?')?'&':'?')+'_cb='+Date.now(),{cache:'no-store'})

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

.then(r=>r.ok?r.json():Promise.reject());

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

try { return await tryOne(REL(p)); } catch { try { return await tryOne(LOCAL(p)); } catch { return null; } }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pool = await getJSON('pool.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const idx = await getJSON('index.json') || {};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Points (from index.json if available)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const pts = (typeof idx.points === 'number') ? idx.points : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Lock days (optional)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const lock = (typeof idx.lock_days === 'number') ? idx.lock_days : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// APY: prefer explicit idx.apy else demo from pool totals

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

let apy = (typeof idx.apy === 'number') ? idx.apy : null;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (apy == null && typeof pool.total_earned === 'number' && typeof pool.total_staked === 'number' && pool.total_staked > 0){

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

apy = (pool.total_earned / pool.total_staked) * 100; // lifetime demo %

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

}

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Paint values

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const setOrHide = (id, val, fmt=(x)=>x)=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const el = document.getElementById(id);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const wrap = el?.closest('.gw-pill');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (!el || !wrap) return;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (val==null || Number.isNaN(val)) { wrap.style.display='none'; return; }

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

el.textContent = fmt(val);

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

};

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-apy-val', apy, (v)=> (v>=100? v.toFixed(0): v>=10? v.toFixed(1): v.toFixed(2)) + '%');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-lock-val', lock, (v)=> v + ' days');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

setOrHide('pill-points-val', pts, (v)=> v.toLocaleString('en-AU'));

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// If at least one pill visible, unhide the row

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const visible = [...document.querySelectorAll('#gw-pills .gw-pill')].some(p=>p.style.display!=='none');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (visible) pills.hidden = false;

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

// Wire Tokenomics button to open modal (inserted by Module B)

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const btn = document.getElementById('pill-tokenomics');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (btn) btn.addEventListener('click', ()=> {

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

const modal = document.getElementById('gw-tokenomics-modal');

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

if (modal) modal.showModal();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

});

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

})();

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.

GoodWave Tokenomics (Demo)

Transparency: Live metrics mirror at docs/data/*.json. Demo APY may differ from realised returns. Not financial advice.